﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Domain.PermisosModule.Contracts.VariedadesGrupos;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Windows.Forms;
using Cesave.Domain.Core.Entities;

namespace Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModels.Catalogs.VariedadesGrupos
{
    /// <summary>
    /// Sección de manejo de grupos de variedades.
    /// </summary>
    public partial class VariedadesGruposViewModel
    {
        #region Private properties

        /// <summary>
        /// Lista de grupos de variedades.
        /// </summary>
        private List<VariedadesGrupo> _grupos;

        /// <summary>
        /// Grupo seleccionado en la vista.
        /// </summary>
        private VariedadesGrupo _grupo;

        #endregion

        #region Public properties

        /// <summary>
        /// Lista de grupos de variedades.
        /// </summary>
        public List<VariedadesGrupo> Grupos
        {
            get
            {
                return _grupos;
            }
            private set
            {
                _grupos = value;
                if (_grupos != null)
                    RaisePropertyChanged("Grupos");
            }
        }

        /// <summary>
        /// Grupo seleccionado en la vista.
        /// </summary>
        public VariedadesGrupo Grupo
        {
            get
            {
                return _grupo;
            }
            private set
            {
                _grupo = value;
                if (_grupo != null)
                    RaisePropertyChanged("Grupo");
            }
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Carga los grupos de variedades de acuerdo al cultivo seleccionado.
        /// </summary>
        private void LoadGrupos()
        {
            StartWaiting();
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
					IVariedadesGrupoService service = IoCFactory.Resolve<IVariedadesGrupoService>();
					e.Result = service.FindVariedadesGruposByCultivo(Cultivo.CultivoGuid);
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    EndWaiting();
                    if (!e.Cancelled && e.Error == null)
                        Grupos = e.Result as List<VariedadesGrupo>;
                    else if (e.Error != null)
                        ShowMessage(e.Error.Message);
                };
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerAsync();
            }
        }

        #endregion

		#region Event methods

		/// <summary>
		/// Agrega un nuevo grupo de variedad.
		/// </summary>
		private void AddNewGrupo(object sender, EventArgs e)
		{
			_view.variedadesGruposBindingSource.AddingNew += AddingNewGrupo;
			_view.variedadesGruposBindingSource.AddNew();
		}

		/// <summary>
		/// Se ejecuta al agregar un nuevo grupo de variedad.
		/// </summary>
		private void AddingNewGrupo(object sender, AddingNewEventArgs e)
		{
			Grupo = new VariedadesGrupo
			{
				CultivoGuid = Cultivo.CultivoGuid,
				CultivoId = Cultivo.CultivoId,
				GrupoGuid = Guid.NewGuid(),
				GrupoId = 0,
				Nombre = string.Empty,
				Status = true,
			};
			Grupo.MarkAsAdded();
			e.NewObject = Grupo;
			FocusDefaultControl();
		}

		/// <summary>
		/// Envía los cambios realizados a los grupos de variedades.
		/// </summary>
		private void SaveGrupos(object s, EventArgs args)
		{
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					IVariedadesGrupoService service = IoCFactory.Resolve<IVariedadesGrupoService>();
					Grupos.ForEach(grupo =>
					{
						if (grupo.ChangeTracker.State == ObjectState.Added)
							service.AddVariedadesGrupo(grupo);
						else
							service.ChangeVariedadesGrupo(grupo);
						grupo.AcceptChanges();
					});
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					EndWaiting();
					if (!e.Cancelled && e.Error == null)
						LoadGrupos();
					else if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		/// <summary>
		/// Identifica el grupo seleccionado.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void SetCurrentGrupo(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if (bindingSource != null && bindingSource.Current != null)
				Grupo = bindingSource.Current as VariedadesGrupo;
		}

		/// <summary>
		/// Se ejecuta cuando la propiedad Grupos cambia de valor.
		/// </summary>
		private void OnGruposPropertyChanged()
		{
			_view.variedadesGruposBindingSource.DataSource = Grupos;
			_view.variedadesGruposBindingSource.CurrentChanged += SetCurrentGrupo;
			SetCurrentGrupo(_view.variedadesGruposBindingSource, new EventArgs());
		}

		/// <summary>
		/// Se ejecuta cuando la propiedad Grupo cambia de valor.
		/// </summary>
		private void OnGrupoPropertyChanged()
		{
		}

		#endregion

	}
}
